/******************************************************************************
 * Copyright 2017 Samuel Bachmann                                             *
 *                                                                            *
 * Redistribution and use in source and binary forms, with or without         *
 * modification, are permitted provided that the following conditions are met:*
 *                                                                            *
 * 1. Redistributions of source code must retain the above copyright notice,  *
 * this list of conditions and the following disclaimer.                      *
 *                                                                            *
 * 2. Redistributions in binary form must reproduce the above copyright       *
 * notice, this list of conditions and the following disclaimer in the        *
 * documentation and/or other materials provided with the distribution.       *
 *                                                                            *
 * 3. Neither the name of the copyright holder nor the names of its           *
 * contributors may be used to endorse or promote products derived from this  *
 * software without specific prior written permission.                        *
 *                                                                            *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"*
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  *
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE  *
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR        *
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF       *
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS   *
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN    *
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)    *
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF     *
 * THE POSSIBILITY OF SUCH DAMAGE.                                            *
 *                                                                            *
 * Author: Samuel Bachmann <samuel.bachmann@gmail.com>                        *
 ******************************************************************************/

#include "rqt_free_gait_action/ActionModel.h"

namespace rqt_free_gait {

/*****************************************************************************/
/** Constructor/Destructor                                                  **/
/*****************************************************************************/

ActionModel::ActionModel(QObject *parent) : QAbstractListModel(parent) {

}

ActionModel::~ActionModel() {

}

/*****************************************************************************/
/** Accessors                                                               **/
/*****************************************************************************/

void ActionModel::addAction(const Action &action) {
  actions_.push_back(action);

#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
  // TODO reset model?
//  beginResetModel();
//  myData.clear();
//  endResetModel();
#else
  reset();
#endif
}

int ActionModel::rowCount(const QModelIndex &parent) const {
  return (int)actions_.size();
}

QVariant ActionModel::data(const QModelIndex &index, int role) const {
  if (!index.isValid()) {
    return QVariant();
  }

  if (role == Qt::TextAlignmentRole) {
    return int(Qt::AlignLeft | Qt::AlignVCenter);
  } else if (role == Qt::DisplayRole) {
    QString name = actions_.at((unsigned long)index.row()).getName();
    return name;
  }

  return QVariant();}

Action ActionModel::getAction(const QModelIndex &index) {
  return actions_.at((unsigned long)index.row());
}

void ActionModel::sortActions() {
  std::sort(actions_.begin(), actions_.end(), ActionModel::comparator);
}

std::vector<Action> ActionModel::getActions() {
  return actions_;
}

/*****************************************************************************/
/** Methods                                                                 **/
/*****************************************************************************/

bool ActionModel::comparator(const Action &l, const Action &r) {
  return l.getName() < r.getName();
}

} // namespace
